package com.example.demo.utils;

import lombok.experimental.UtilityClass;

import javax.servlet.http.HttpServletRequest;

/**
 * @Description TODO
 * @Date 2024/3/12 16:04
 * @Author ShaoJie Cen
 */
@UtilityClass
public class IpUtil {
    /**
     * 获取HTTP请求中的客户端IP地址
     *
     * @param request HTTP请求对象
     * @return 客户端IP地址字符串，如果无法获取则返回null
     */
    public  String getIpAddr(HttpServletRequest request) {
        // 从X-Forwarded-For头部中获取（如果有代理服务器）
        String xfHeader = request.getHeader("X-Forwarded-For");
        if (xfHeader != null && !xfHeader.isEmpty() && !"unknown".equalsIgnoreCase(xfHeader)) {
            // 取第一个IP（可能有多层代理）
            return xfHeader.split(",")[0];
        }

        // 获取代理服务器后面的客户端IP
        String realIp = request.getHeader("X-Real-IP");
        if (realIp != null && !realIp.isEmpty() && !"unknown".equalsIgnoreCase(realIp)) {
            return realIp;
        }

        // 如果以上两种方式都无法获取，则直接从request.getRemoteAddr()获取
        return request.getRemoteAddr();
    }
}
